/**
 * 
 */
package nl.boektrust.btsoep.client;

import nl.boektrust.btsoep.shared.model.ISBN;
import nl.boektrust.btsoep.shared.model.ISBNReference;
import nl.boektrust.btsoep.shared.model.ISBNReferenceType;

import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.FocusHandler;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;

/**
 * @author rao3
 *
 */
public class EditBookVerwijzingenISBNPanel extends EditBookPanel implements ClickHandler, FocusHandler, BlurHandler, ValueChangeHandler<String>, KeyPressHandler, ChangeHandler {
	private ListBox verwijzingTypeListBox = new ListBox();
	private TextBox verwijzingTextBox;
	private Button xButton = new Button("ok");;
	private ISBNReference isbnReference;
	private boolean isNewField = false;
	private EditBookDialog parentDialog;
	int numFocusedElements = 1;


	public EditBookVerwijzingenISBNPanel(String label, ISBNReference isbnReference, boolean isInEditMode, EditBookDialog parentDialog) {
		super(label, isInEditMode);
		super.getLabel().setTitle("Om een verwijzing te verwijderen, selecteer 'onbekend'");
		
		// set up display panel
		this.parentDialog = parentDialog;
		this.verwijzingTypeListBox = new ListBox();
		for (ISBNReferenceType t : ISBNReferenceType.values()) {
			this.verwijzingTypeListBox.addItem(ISBNReferenceType.stringValue(t));			
		}
		this.verwijzingTextBox = new TextBox();
		this.verwijzingTextBox.addValueChangeHandler(this);
		this.verwijzingTypeListBox.addChangeHandler(this);
		xButton.addClickHandler(this);
		editPanel.add(this.verwijzingTypeListBox);
		editPanel.add(this.verwijzingTextBox);
		editPanel.add(xButton);


		if (isbnReference != null) {
			this.setValue(isbnReference);
			isNewField = false;
		} else {
			this.setValue(new ISBNReference());
			isNewField = true;
		}
		
		if (isInEditMode == true) {
			setToEditMode();
		} else {
			setToDisplayMode();
		}
	}
	
	public EditBookVerwijzingenISBNPanel(String label, ISBNReference isbnReference, boolean isInEditMode) {
		this (label, isbnReference, isInEditMode, null);
	}
		
	
	/**
	 * @return the isbnReference
	 */
	public ISBNReference getIsbnReference() {
		return isbnReference;
	}

	/**
	 * @param isbnReference the isbnReference to set
	 */
	public void setIsbnReference(ISBNReference isbnReference) {
		this.isbnReference = isbnReference;
	}
	
	public void setValue(ISBNReference isbnReference) {
		this.setIsbnReference(isbnReference);
		// set label
		

		if (isbnReference.getIsbn() == null || isbnReference.getIsbn().getIsbn13().length() == 0) {
			theLabel.setText("Klik om te veranderen");
		} else {
			theLabel.setText(new String(ISBNReferenceType.stringValue(this.isbnReference.getIsbnReferenceType()) + " " + isbnReference.getIsbn().getIsbn13()));
		}
		// set textbox
		if (isbnReference.getIsbn() != null)	verwijzingTextBox.setText(isbnReference.getIsbn().getIsbn13());
		// set dialog box
		for (int i=0; i<verwijzingTypeListBox.getItemCount(); i++) {
			if (verwijzingTypeListBox.getItemText(i).equals(ISBNReferenceType.stringValue(isbnReference.getIsbnReferenceType()))) {
				verwijzingTypeListBox.setSelectedIndex(i);
			}
		}
	}


	public EditBookVerwijzingenISBNPanel(String label, boolean isInEditMode) {
		this(label, null, isInEditMode);
	}

	public EditBookVerwijzingenISBNPanel(boolean isInEditMode) {
		this("", isInEditMode);
	}

	public EditBookVerwijzingenISBNPanel(String label) {
		this(label, false);
	}

	public EditBookVerwijzingenISBNPanel() {
		this(false);
	}
	
	boolean hasInvalidData() {
		return false;
	}


	@Override void setToDisplayMode() {
		super.setToDisplayMode();
		if (isbnReference == null) {
			return;
		}
		if (isbnReference != null && isbnReference.getIsbn() != null && isbnReference.getIsbn().getIsbn12().length() > 0) {
			theLabel.setText(ISBNReferenceType.stringValue(isbnReference.getIsbnReferenceType())+" ISBN: "+isbnReference.getIsbn().getIsbn13());
		} else {
			theLabel.setText("Klik om te veranderen");
		}
	}
	/*@Override
	void setToDisplayMode() {
		super.clearPanel();
		if (isNewField == false) {
			if (isbnReference == null) {
				System.out.println("EditBookVerwijzingen: isbnReference is null");
			}
			System.out.println("EditBookVerwijzingen: isbnReference: type: "+isbnReference.getIsbnReferenceType());
			System.out.println("EditBookVerwijzingen: isbnReference: value: "+isbnReference.getIsbn13());

			theLabel = new Label(ISBNReferenceType.stringValue(isbnReference.getIsbnReferenceType())+" ISBN: "+isbnReference.getIsbn13());
		} else {
			theLabel = new Label("Voeg nieuwe ISBN-verwijzing toe");
		}
		this.add(theLabel);
		theLabel.addClickHandler(this);		
	}*/
	
	public void onClick(ClickEvent event) {
		if (event.getSource() ==theLabel) {		
			this.toggleEditMode();
		} else if (event.getSource() == xButton) {
			setInEditMode(false);
			this.setToDisplayMode();
		}
		
	}

	public void onBlur(BlurEvent event) {
		numFocusedElements--;
		if (numFocusedElements <= 0) {
			super.toggleEditMode();
		}
	}

	public void onFocus(FocusEvent event) {
		numFocusedElements++;
		
	}
	

	public void onValueChange(ValueChangeEvent event) {
		if (event.getSource()== verwijzingTextBox) {
			try {
				isbnReference.setIsbn(new ISBN(verwijzingTextBox.getText()));
			} catch (Exception e) {
				e.printStackTrace();
			}
		} 
		parentDialog.panelHasChanged();
	}

	public void onKeyPress(KeyPressEvent event) {
	/*	if (event.getSource() == kleurTextBox || event.getSource() == zwTextBox) {
			if (Character.isLetter(event.getCharCode()) || Character.isSpace(event.getCharCode())) {
		          ((TextBox) event.getSource()).cancelKey();
		        }
		}*/
		
	}

	public void onChange(ChangeEvent event) {
		if (event.getSource() == verwijzingTypeListBox) {
			for (ISBNReferenceType t : ISBNReferenceType.values()) {
				if (ISBNReferenceType.stringValue(t).equals(verwijzingTypeListBox.getItemText(verwijzingTypeListBox.getSelectedIndex()))) {
					isbnReference.setIsbnReferenceType(t);
				}
			}

		}
	}

	


}
